'use strict'
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
import NProgress from '@/utils/nprogress' // progress bar

import { errorHandler } from './helper'

/**
 * 配置request请求时的默认参数
 */
const request = axios.create({
  // baseURL: process.env.NODE_ENV === "development" ? "" : "/sso",
  // withCredentials: true, // 当跨域请求时发送cookie
  timeout: 60 * 1000, // 请求超时时间,60 * 1000(单位毫秒) / 0 不做限制
})

// 全局设置 - post请求头
// request.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

/**
 * 请求前
 * 请求拦截器
 */
request.interceptors.request.use(
  async (config) => {
    if (config.headers) {
      // 如果设置了cType 说明是自定义 添加 Content-Type类型 为自定义post 做铺垫
      if (config['cType']) {
        config.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
      }

      // 自定义添加token header
      const headerToken = localStorage.getItem('token')
      // console.log(headerToken)

      if (headerToken) {
        config.headers['Authorization'] = 'Bearer ' + headerToken
      }
      // 对入参进行转换（小驼峰 -> _）
      // config.data = bodyParser(config.data, "_");

      // development模式下把请求baseUrl和完整url添加在header中以供调试
      config.headers['Dev-BaseURL'] = config.baseURL
      config.headers['Dev-Full-URL'] = `${config.baseURL}${config.url}`
    }
    NProgress.start()
    return config
  }
  /* error=> {} */ // 已在 export default catch
)

/**
 * 请求后
 * 响应拦截器
 */
request.interceptors.response.use(
  async (response) => {
    NProgress.done()
    const res = response.data

    // 自定义状态码验证
    if (!res.success && res.code) {
      return Promise.reject({
        response,
        errorType: 'CustomError',
      })
    }
    return res
  }
  /* error => {} */ // 已在 export default catch
)

/**
 * 导出带错误处理的axios实例
 *
 * Method: get
 *     Request Headers
 *         无 - Content-Type
 *     Query String Parameters
 *         name: name
 *         age: age
 *
 * Method: post
 *     Request Headers
 *         Content-Type:application/json;charset=UTF-8
 *     Request Payload
 *         { name: name, age: age }
 *         Custom config parameters
 *             { cType: true }  Mandatory Settings Content-Type:application/json;charset=UTF-8
 * ......
 */
export default function (config) {
  return request(config)
    .then((response) => response)
    .catch((error) => errorHandler(error))
}
